package com.authine.cloudpivot.ext.util;

import java.security.MessageDigest;

/**
 * @program: gomro
 * @description:
 * @author: wlw
 * @create: 2021-10-15 11:02
 **/
public class HashUtil {
    private static final char[] HEX_DIGITS = "0123456789abcdef".toCharArray();

    /**
     * 功能说明：使用MD5算法对字符串参数进行哈希处理
     * 修改说明：
     * @author zheng
     * @date 2020年6月29日 下午2:40:32
     * @param srcStr 原字符串
     * @return 返回md5哈希处理后的字符串
     */
    public static String md5(String srcStr){
        return hash("MD5", srcStr);
    }

    /**
     * 功能说明：使用sha1算法对字符串参数进行哈希处理
     * 修改说明：
     * @param srcStr 原字符串
     * @return 返回sha1哈希处理后的字符串
     */
    public static String sha1(String srcStr){
        return hash("SHA-1", srcStr);
    }

    /**
     * 功能说明：使用sha256算法对字符串参数进行哈希处理
     * 修改说明：
     * @param srcStr 原字符串
     * @return 返回sha256哈希处理后的字符串
     */
    public static String sha256(String srcStr){
        return hash("SHA-256", srcStr);
    }

    /**
     * 功能说明：使用sha384算法对字符串参数进行哈希处理
     * 修改说明：
     * @param srcStr 原字符串
     * @return 返回sha384哈希处理后的字符串
     */
    public static String sha384(String srcStr){
        return hash("SHA-384", srcStr);
    }

    /**
     * 功能说明：使用sha512算法对字符串参数进行哈希处理
     * 修改说明：
     * @param srcStr 原字符串
     * @return 返回sha512哈希处理后的字符串
     */
    public static String sha512(String srcStr){
        return hash("SHA-512", srcStr);
    }


    /**
     * 功能说明：对原字符串使用指定加密算法进行哈希处理
     * 修改说明：
     * @param algorithm 加密算法
     * @param srcStr 原字符串
     * @return 返回哈希处理后的字符串
     */
    public static String hash(String algorithm, String srcStr) {
        try {
            MessageDigest md = MessageDigest.getInstance(algorithm);
            byte[] bytes = md.digest(srcStr.getBytes("utf-8"));
            return toHex(bytes);
        }
        catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    /**
     * 功能说明：把字节数组转为16进制字符串
     * 修改说明：
     * @author zheng
     * @date 2020年6月29日 下午2:34:48
     * @param bytes
     * @return
     */
    private static String toHex(byte[] bytes) {
        StringBuilder ret = new StringBuilder(bytes.length * 2);
        for (int i=0; i<bytes.length; i++) {
            ret.append(HEX_DIGITS[(bytes[i] >> 4) & 0x0f]);
            ret.append(HEX_DIGITS[bytes[i] & 0x0f]);
        }
        return ret.toString();
    }
}
